perm filename ARRAY.MAN[VLI,LSP] blob
sn#381933 filedate 1978-09-08 generic text, type T, neo UTF8
CHAPITRE 6
LES TABLEAUX ET LA PILE UTILISATEUR
Un nouveau type d'objet est apparu, le tableau . Un tableau est un
ensemble de memoires contigues pouvant contenir n'importe quel objet
lisp (atomes, nombres, chaines ou listes). Les differents elements
d'un tableau sont numerotes a l'aide d'un indice. Tous les tableaux
sont actuellement uni-dimensionnes par souci d'efficacite, le
premier indice est 0 (ces tableaux sont donc des vecteurs).
Les differents tableaux sont stockes dans une zone speciale; cette
zone est partagee avec la pile utilisateur. Les fonctions sur les
tableaux permettent de definir un tableau, d'avoir acces aux
elements d'un tableau, de modifier un element d'un tableau ou
d'appliquer une fonction aux differents elements d'un tableau.
6.1 DEFINITION ET ACCES AUX TABLEAUX
(DA <nom> <taille> <fonction>) [SUBR a 3 arguments]
permet de definir un nouveau tableau. <nom> est un atome
litteral qui devient le nom du tableau; <taille> est le nombre
d'elements que peut contenir le tableau. S'il n'y a pas assez
de place pour stocker ce nouveau tableau, l'erreur suivante
apparait :
** no room for arrays.
Si la fonction (d'initialisation) n'est pas fournie (si
<fonction>=NIL), tous les elements du tableau sont initialises
a NIL; dans le cas contraire, la fonction est appliquee pour
chaque element avec l'indice de cet element lie au 1er argument
(s'il existe) de la fonction. Il peut donc y avoir un appel
implicite de la fonction MAPARRAY. Les differentes valeurs
ramenees par cette fonction seront les valeurs d'initialisation
des elements du tableau. DA ramene le nom du tableau en
valeur.
ex : (DA 'TAB 100) ; definition d'un tableau de nom TAB de
100 elements. Chaque element est
initialise a NIL ;
VLISP 10 . 3 Manuel de Reference Page 6-2
(DA 'TBL 10 '(LAMBDA (X) 0)) ; definition d'un tableau de
10 elements, chaque element
est initialise a 0 ;
(DA 'ARR 10 ; definition d'un tableau de 10
'(LAMBDA (X) (- 9 X))) elements initialises a :
9 8 7 6 5 4 3 2 1 0 ;
Une fois le tableau defini, on a acces a chacun des elements du
tableau en evaluant une forme a 1 argument dont la fonction est le
nom du tableau et l'argument l'indice de l'element desire. Le nom
du tableau devient donc une fonction d'acces a ce tableau.
L'argument de cette fonction d'acces est evalue.
L'interprete ne teste la validite de l'indice fourni que si le
bit 7 du R.G. est positionne (ce qui est l'option par defaut).
il est facile de definir de nouvelles fonctions d'acces a des
tableaux deja definis ce permet de tester la validite du ou des
indices (voir les derniers exemples).
ex : (TAB 5) -> NIL
(TBL (ADD1 4)) -> 0
6.2 LES FONCTIONS STANDARD SUR LES TABLEAUX
Pour toutes les fonctions sur les tableaux qui vont etre decrites,
les erreurs (le nom fourni n'est pas un nom de tableau ou l'indice
est incorrect) sont signalees par le message :
** array error : <nom du tableau> <indice>
(DIM <nom>) [SUBR a 1 argument]
l'argument <nom> doit etre un nom de tableau. DIM ramene le
plus grand indice de ce tableau.
ex : (DA 'TAB 50) -> TAB
(DIM 'TAB) -> 49
(SETA <nom> <indice> <valeur>) [SUBR a 3 arguments]
met dans l'element du tableau specifie par le nom et l'indice,
la valeur fournie en troisieme argument. SETA ramene en valeur
la valeur chargee.
ex : (SETA 'TAB 5 10) -> 10
(TAB 5) -> 10
VLISP 10 . 3 Manuel de Reference Page 6-3
(SETQA <nom> <indice> <valeur>) [FSUBR]
est identique a la fonction SETA mais le nom du tableau n'est
pas evalue, en revanche l'indice <indice> et la valeur <valeur>
le sont toujours.
ex : (SETQA TAB 6 (ADD1 19)) -> 20
(TAB 20) -> 20
(MAPARRAY <nom> <fonction>) [SUBR a 2 arguments]
permet d'appliquer la fonction specifiee pour chacun des
elements du tableau dont le nom est donne. Le 1er argument de
la fonction est lie (s'il existe) a l'indice de l'element du
tableau. MAPARRAY ramene NIL en valeur.
ex : (MAPARRAY 'TAB '(LAMBDA (X) (SETA 'TAB X (ADD1 X))))
-> NIL
(MAPARRAYQ <nom> <fonction>) [FSUBR]
est identique a la fonction MAPARRAY mais le nom du tableau
n'est pas evalue, en revanche le nom de la fonction l'est
toujours.
(FILLARRAY <nom> <liste>) [SUBR a 2 arguments]
range dans les differents elements du tableau, dont le nom est
specifie comme 1er argument, les elements successifs de la
liste 2eme argument. Si la liste est trop courte, le reste du
tableau est rempli avec des NILs ; si la liste 2eme argument
est en realite un atome, le tableau est rempli avec cet atome.
FILLARRAY ramene le nom du tableau en valeur.
ex : (DA 'TAB 10) -> TAB
(FILLARRAY 'TAB '(0 1 2 3 4 5 6)) -> TAB
(FILLARAY 'TAB '99) -> TAB
(LISTARRAY <nom>) [SUBR a 1 argument]
ramene la liste constituee de tous les elements du tableau dont
le nom est fourni en 1er argument.
ex : (DA 'TAB 5) -> TAB
(FILLARRAY 'TAB '(10 11 12)) -> TAB
(LISTARRAY 'TAB) -> (10 11 12 NIL NIL)
VLISP 10 . 3 Manuel de Reference Page 6-4
6.3 EXEMPLES D'UTILISATION DES TABLEAUX
? (DA 'TAB 100) ; definition d'un tableau de nom TAB ;
= TAB ; possedant 100 elements, chacun des ;
; elements est initialise a NIL. ;
? (DIM 'TAB)
= 99
? (DE TAB1 (I) ; definition d'une nouvelle fonction ;
? (IF (LE 0 I 99) ; d'acces a TAB1 qui teste la validite ;
? (TAB I) ; de l'indice fourni ;
? (ERROR ["debordement TAB1 " I])))
= TAB
? (DE TAB2 (I J) ; definition d'une nouvelle fonction ;
? (IF (AND (LE 0 I 9) ; permettant d'acceder au tableau ;
? (LE 0 J 9)) ; TAB au moyen de 2 indices pouvant ;
? (TAB (PLUS (TIMES I 10) J)) ; varier de 0 a 9. Cette ;
? (ERROR ["debordement TAB2 " I J]))) ; fonction teste ;
; les indices fournis ;
= TAB2
? (SETQA TAB 20 3)
= 3
? (TAB1 20)
= 3
? (TAB2 2 0)
= 3
? (DA 'CLAIR 10 '(LAMBDA (X)
? ((ADD1 X) '("zero" "un" "deux" "trois" "quatre"
? "cinq" "six" "sept" "huit" "neuf"))))
= CLAIR
? (CLAIR 1)
= "un"
? (CLAIR 2)
= "deux"
? (MAPARRAYQ CLAIR (LAMBDA (X)
? (SETQA CLAIR X (CONCAT "-" (CLAIR X) "-"))))
= NIL
? (CLAIR 9)
= "-neuf-"
VLISP 10 . 3 Manuel de Reference Page 6-5
6.4 LA PILE UTILISATEUR
Il existe une zone menmoire dans laquelle il est possible de sauver
temporairement des objets lisp quelconques. Cette zone est geree
comme une pile; c'est la pile utilisateur (qui n'a aucun rapport
avec la pile utilisee par l'interprete). La zone dans laquelle est
stockee cette pile utilisateur etant partagee avec les tableaux, sa
taille est donc determinee par la difference entre la taille de la
zone allouee aux tableaux et la somme des tailles de tous les
tableaux definis. En cas de debordement de pile les erreurs
suivantes apparaissent :
** user stack overflow.
** user stack underflow.
Apres ces erreurs (comme apres toute autre erreur) le pointeur de
pile utilisateur est reinitialise.
(PUSH <s1> ... <sN>) [SUBR a N arguments]
empile les valeurs des differentes expressions <s1> ... <sN>
et ramene <sN> en valeur. Toutefois si aucun argument n'est
fourni (i.e. si on evalue (PUSH)), une valeur NIL est quand
meme empilee.
(POP <n>) [SUBR a 1 argument]
si l'argument <n> n'est pas fourni, le sommet de pile est
ramene en valeur et le pointeur de pile est mis a jour. Si
l'argument numerique <n> est donne, POP ramene le <n>ieme
element contenu dans la pile a partir du pointeur de pile mais
celui-ci n'est pas modifie. Si ce nombre est negatif, on peut
avoir acces a des elements de la pile precedemment empiles puis
depiles. Il ne faut toutefois pas sortir de la zone allouee
pour la pile sous peine de declencher les erreurs de
debordement de pile.
(PSTACK <n>) [SUBR a 1 argument]
si l'argument <n> n'est pas fourni, ramene le pointeur de pile
courant. Si l'argument numerique <n> est fourni, il devient la
nouvelle valeur du pointeur de pile. Cette fonction sert donc
tout naturellement a manipuler le pointeur de pile lui-meme.
Exemples d'utilisation de la pile utilisateur
ex : (PUSH 'A 3) -> 3
(PUSH) -> NIL
(PUSH 'B) -> B
(POP 0) -> B
(POP 1) -> NIL
VLISP 10 . 3 Manuel de Reference Page 6-6
(POP 2) -> 3
(POP) -> B
(POP) -> NIL
(POP 1) -> A
(POP -2) -> B
(POP) -> 3
(POP) -> A
(PUSH 1 2) -> 2
(SETQ PPILE (PSTACK)) -> 33456 (par exemple)
(PUSH 3 4 5 6 7 8) -> 8
(PSTACK PPILE) -> 33456
(POP) -> 2
(POP) -> 1
(POP)
** user stack underflow.
... etc ...
Page Index-1
TABLE D'INDEX DU CHAPITRE 6
(DA nom taille fonction) SUBR a 3 arguments 6-1
(DIM nom) SUBR a 1 argument . 6-2
(FILLARRAY nom liste) SUBR a 2 arguments 6-3
(LISTARRAY nom) SUBR a 1 argument 6-3
(MAPARRAY nom fonction) SUBR a 2 arguments 6-3
(MAPARRAYQ nom fonction) FSUBR 6-3
(POP n) SUBR a 1 argument . . 6-5
(PSTACK n) SUBR a 1 argument 6-5
(PUSH s1 ... sn) SUBR a n arguments 6-5
(SETA nom indice valeur) SUBR a 3 arguments 6-2
(SETQA nom indice valeur) FSUBR 6-3
** array error : <nom du tableau> <indice> 6-2
** no room for arrays. . . . . 6-1
** user stack overflow. . . . . 6-5
** user stack underflow. . . . 6-5
Bit 7 du r.g. . . . . . . . . . 6-2
Pile utilisateur . . . . . . . 6-5
Tableau . . . . . . . . . . . . 6-1